/* eslint valid-jsdoc: "off" */

"use strict";

/**
 * @param {Egg.EggAppInfo} appInfo app info
 */
module.exports = (appInfo) => {
  /**
   * built-in config
   * @type {Egg.EggAppConfig}
   **/
  const config = (exports = {});

  // 端口修改
  config.cluster = {
    listen: {
      path: "",
      port: 5555,
      hostname: "0.0.0.0",
    },
  };

  // 模板配置
  config.view = {
    defaultViewEngine: "ejs",
    mapping: {
      ".ejs": "ejs", // 左边写成.html后缀，会自动渲染.html文件
    },
  };

  config.static = {
    prefix: "/public/",
    uploadDir: "app/public/upload",
    // dynamic: true,
    dir: ["app/public"],
    maxAge: 0,
    // preload: false,
    // buffer: true,
  };

  // use for cookie sign key, should change to your own and keep security
  config.keys = appInfo.name + "_1618827300490_1401";

  // add your middleware config here
  config.middleware = [];

  // 关闭csrf
  config.security = {
    csrf: {
      enable: false,
      ignoreJSON: true,
    },
    domainWhiteList: ["*"],
  };

  config.JWT_CONFIG = {
    key: "mock-token-key",
    TIME: "1d", // 失效时间 10
  };

  config.md5 = {
    key: "eggcms", // md5 加盐
  };

  config.cors = {
    origin: "*",
    allowMethods: "GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS",
  };

  // add your middleware config here
  config.middleware = ["notfoundHandler", "errorHandler"];

  // 只对 /api 前缀的 url 路径生效
  config.errorHandler = {
    // match: '/web-api',
  };

  config.onerror = {
    all(err, ctx) {
      console.error(" ---------- err, ctx");
      console.error(err, ctx);
      // 在此处定义针对所有响应类型的错误处理方法
      // 注意，定义了 config.all 之后，其他错误处理方法不会再生效
      // ctx.body = 'error';
      ctx.body = { code: 500, message: "服务异常 all" };
      ctx.status = 500;
    },
    // html(err, ctx) {
    //   // html hander
    //   ctx.body = '<h3>服务异常</h3>';
    //   ctx.status = 500;
    // },
    // json(err, ctx) {
    //   // json hander
    //   ctx.body = { code: 500, message: '服务异常 json' };
    //   ctx.status = 500;
    // },
    // jsonp(err, ctx) {
    //   // 一般来说，不需要特殊针对 jsonp 进行错误定义，jsonp 的错误处理会自动调用 json 错误处理，并包装成 jsonp 的响应格式
    // },
  };

  // https://www.npmjs.com/package/egg-swagger-doc
  config.swaggerdoc = {
    dirScanner: "./app/controller", // 配置自动扫描的控制器路径。
    // 接口文档的标题，描述或其它。
    apiInfo: {
      title: "mock api 服务接口", // 接口文档的标题。
      description: "swagger-ui mock api 服务接口", // 接口文档描述。
      version: "1.0.0", // 接口文档版本。
    },
    schemes: ["http", "https"], // 配置支持的协议。
    consumes: ["application/json"], // 指定处理请求的提交内容类型（Content-Type），例如application/json, text/html。
    produces: ["application/json"], // 指定返回的内容类型，仅当request请求头中的(Accept)类型中包含该指定类型才返回。
    securityDefinitions: {
      // 配置接口安全授权方式。
      apikey: {
        type: "apiKey",
        name: "token",
        in: "header",
      },
      oauth2: {
        type: "oauth2",
        // tokenUrl: 'http://petstore.swagger.io/oauth/dialog',
        tokenUrl: "http://localhost:5555/mock-api/auth/login",
        flow: "password",
        scopes: {
          "write:token": "write token",
          "read:token": "read token",
        },
      },
    },
    enableSecurity: false, // 是否启用授权，默认 false（不启用）。
    // enableValidate: true,    // 是否启用参数校验，默认 true（启用）。
    routerMap: !true, // 是否启用自动生成路由，默认 true (启用)。
    enable: true, // 默认 true (启用)。
  };

  // socket-io egg
  // 这里的 auth 以及 filter 是待会会编写的两个中间件，用于不用依据自己的情况选择即可
  // config.io = {
  //   namespace: {
  //     '/': {
  //       connectionMiddleware: [ 'auth' ],
  //       packetMiddleware: [ 'filter' ],
  //     },
  //   },
  // };

  // add your user config here
  const userConfig = {
    // myAppName: 'egg',
  };

  return {
    ...config,
    ...userConfig,
  };
};
